package _go

/*1669. 合并两个链表
难度
中等

16

收藏

分享
切换为英文
接收动态
反馈
给你两个链表 list1 和 list2 ，它们包含的元素分别为 n 个和 m 个。

请你将 list1 中第 a 个节点到第 b 个节点删除，并将list2 接在被删除节点的位置。

下图中蓝色边和节点展示了操作后的结果：


请你返回结果链表的头指针。



示例 1：



输入：list1 = [0,1,2,3,4,5], a = 3, b = 4, list2 = [1000000,1000001,1000002]
输出：[0,1,2,1000000,1000001,1000002,5]
解释：我们删除 list1 中第三和第四个节点，并将 list2 接在该位置。上图中蓝色的边和节点为答案链表。
示例 2：


输入：list1 = [0,1,2,3,4,5,6], a = 2, b = 5, list2 = [1000000,1000001,1000002,1000003,1000004]
输出：[0,1,1000000,1000001,1000002,1000003,1000004,6]
解释：上图中蓝色的边和节点为答案链表。


提示：

3 <= list1.length <= 104
1 <= a <= b < list1.length - 1
1 <= list2.length <= 104*/

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func mergeInBetween(list1 *ListNode, a int, b int, list2 *ListNode) *ListNode {
	if list1 == nil {
		return list2
	}
	if list2 == nil {
		return list1
	}

	pre := &ListNode{0, list1}
	res := pre

	i, j := 0, a
	for i = 0; i < a; i++ {
		pre = pre.Next
	}
	//前边链表的尾节点
	list1Tail := pre
	//fmt.Printf("pre tial %s  i %d\n",list1Tail,i)
	for j = a; j <= b; j++ {
		pre = pre.Next
	}
	//后边的头结点
	head := pre.Next
	//fmt.Printf("pre head %s j %d \n",pre,j)

	//拼接链表
	list1Tail.Next = list2

	for list2.Next != nil {
		list2 = list2.Next
	}
	//拼接后半段
	list2.Next = head

	return res.Next
}
